package cn.lingyangwl.agile.auth.model.rqrs.third;

import cn.lingyangwl.agile.auth.oauth2.model.OAuth2TokenResp;
import cn.lingyangwl.agile.model.constants.SexEnum;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.HashMap;
import java.util.Map;

/**
 * 第三方登录后的授权用户信息
 *
 * @author shenguangyang
 */
@Data
@Accessors(chain = true)
public class ThirdAuthUser {
    /**
     * 用户登录id
     */
    private String loginId;

    /**
     * 平台用户id, 如果是未绑定状态则为空
     */
    private Long userId;

    /**
     * 用户第三方系统的唯一id。在调用方集成该组件时，可以用 openId + source唯一确定一个用户
     */
    private String openId;

    /**
     * 用户名
     */
    private String username;

    /**
     * 用户昵称
     */
    private String nickname;

    /**
     * 用户头像
     */
    private String avatar;

    /**
     * 用户手机号, 一般平台不会直接返回, 比如微信小程序想要获取用户手机号, 需要调用单独接口才能获取到
     */
    private String phone;

    /**
     * 用户网址
     */
    private String blog;

    /**
     * 所在公司
     */
    private String company;

    /**
     * 位置
     */
    private String location;

    /**
     * 用户邮箱
     */
    private String email;

    /**
     * 用户备注（各平台中的用户个人介绍）
     */
    private String remark;

    /**
     * 性别
     * @see SexEnum
     */
    private String sex;

    /**
     * 用户来源
     */
    private String source;

    /**
     * 重定向到前端的地址
     */
    protected String redirectUrl;

    /**
     * 是否第一次绑定
     */
    private Boolean isFirstBind = Boolean.FALSE;

    /**
     * 是否绑定平台账号
     */
    private Boolean isBind = Boolean.FALSE;

    /**
     * 用户授权的token信息(非第三方返回的token, 而是本地生成的token)
     */
    private OAuth2TokenResp authToken;

    /**
     * 第三方平台返回的原始用户信息
     */
    @JsonIgnore
    @JSONField(serialize = false)
    private JSONObject rawUserInfo;

    /**
     * 是否后端进行重定向
     */
    @JsonIgnore
    @JSONField(serialize = false)
    private Boolean isRedirect = Boolean.FALSE;

    /**
     * token中的数据
     */
    @JsonIgnore
    @JSONField(serialize = false)
    private Map<String, Object> tokenClaims = new HashMap<>();
}
